package com.unicdata.twofactorauth.storage;

import java.util.List;
import java.util.Optional;

/**
 * 2FA存储接口
 * 使用者可以实现此接口来提供自定义的存储逻辑
 *
 * @author lhn
 * @date 2025/07/03
 * @since 1.0.0
 */
public interface TwoFactorStorage {

    /**
     * 保存用户的2FA密钥
     *
     * @param userId 用户ID
     * @param secret 密钥
     * @return 是否保存成功
     */
    boolean saveSecret(String userId, String secret);

    /**
     * 获取用户的2FA密钥
     *
     * @param userId 用户ID
     * @return 密钥，如果不存在返回空
     */
    Optional <String> getSecret(String userId);

    /**
     * 删除用户的2FA密钥
     *
     * @param userId 用户ID
     * @return 是否删除成功
     */
    boolean deleteSecret(String userId);

    /**
     * 保存恢复码
     *
     * @param userId 用户ID
     * @param recoveryCodes 恢复码列表
     * @return 是否保存成功
     */
    boolean saveRecoveryCodes(String userId, List <String> recoveryCodes);

    /**
     * 获取恢复码
     *
     * @param userId 用户ID
     * @return 恢复码列表
     */
    List<String> getRecoveryCodes(String userId);

    /**
     * 使用恢复码（使用后删除）
     *
     * @param userId 用户ID
     * @param recoveryCode 恢复码
     * @return 是否使用成功
     */
    boolean useRecoveryCode(String userId, String recoveryCode);

    /**
     * 删除所有恢复码
     *
     * @param userId 用户ID
     * @return 是否删除成功
     */
    boolean deleteAllRecoveryCodes(String userId);

    /**
     * 检查用户是否启用了2FA
     *
     * @param userId 用户ID
     * @return 是否启用
     */
    boolean isTwoFactorEnabled(String userId);

    /**
     * 设置用户2FA启用状态
     *
     * @param userId 用户ID
     * @param enabled 是否启用
     * @return 是否设置成功
     */
    boolean setTwoFactorEnabled(String userId, boolean enabled);

}